The present application relates generally to distributed memory management systems and more specifically to mechanisms for assigning efficiently referenced globally unique identifiers in a multi-core environment.
In multi-core environments, it is often necessary to manage independent workloads or pieces of workloads across several cores. In order to facilitate cross-core management of workloads, a host program tracks how the cores are allocated to each workload. Moreover, it may be necessary for the cores to identify one another for communication purposes. In this regard, there may be a considerable number of memory address spaces to coordinate such communications between the various cores, as is the case with Cell Broadband Engine Architecture (CBEA).
A typical CBEA includes at least one Power PC® processor element (PPE) core and 8 Synergistic Processor Element (SPE) cores each with 256 KB fast local memory per SPE, as well as a globally coherent direct memory access (DMA) engine for transferring data between local memories and the shared system memory. The management of these resources in a global manner requires system-wide unique identifiers. For each core to identify other cores, the identifiers that are used must be translated into useful data (e.g., a structure, a pointer). This translation may involve looking up data that is associated with a given identifier, as by using an index into a memory array. In the case of indexed memory arrays, there are a number of indexing mechanisms that can be implemented. One way is to employ a globally unique index number (i.e., absolute index) to identify each particular core in the multi-core environment. Another way is to employ a relative index that is unique to just a subset of cores.
However, the translation of these types of indexes into data requires considerable overhead. Relative indexes may not be globally unique across separate sets of cores. Thus, the host or master managing these resources requires additional information to make each identifier unique. For example, in the case of separate sets of cores, such additional information could identify the particular set of cores to which the identifier is associated. In addition, sharing identifier information requires translation into an identifier that is recognized by the recipient, which can prove to be inefficient.
While the use of absolute indexes remedies the global uniqueness issues present in relative indexing, the implementation of absolute indexing requires the entire address table to be available wherever the indices are used. This consumes an unnecessary amount of memory resources, especially if memory space is constrained within the multi-core system. To obviate the need to have an entire address table stored in each location where the absolute indices are used, one method to reduce memory in this scenario is to (i) only make a contiguous portion of the entire globally-unique table available in each location and (ii) use an adjustment factor on the index to make it relative. However, like the above scenario involving relative indexing, the adjustment factor adds to the translation overhead.
In addition to the inefficiencies associated with absolute and relative indexing, static indices that persist across all sets of cores (e.g., a master's identifier) can create gaps in the continuity of the indexes used in the tables. The handling of these gaps in the indexing can be handled in a number of ways, but none of these ways are optimal. For example, empty entries can be added to fill the holes in the table, which wastes memory space. Another option is to “special-case” the holes in the indexing, which adds additional steps in the processing of the indices.